// 芯片引脚信息生成器 v13 - 修复芯片宽度计算
function generateChipPinout() {
    // 收集所有错误信息
    const errors = [];
    let result = '';

    try {
        // 通过API获取选中的ID(s)（逗号分隔的字符串）
        const idsStr = api('getSelectedIds');

        // 将逗号分隔的字符串转换为ID数组
        const idList = (idsStr || '').split(',').map(id => id.trim()).filter(Boolean);

        // 检查是否有选中的ID
        if (!idList || idList.length === 0) {
            errors.push('未选中任何元件');
            return '/* 错误: 未选中任何元件 */';
        }

        // 生成每个选中元件的引脚图
        result = idList.map(id => {
            try {
                // 获取元件形状数据
                const obj = api('getShape', { id });

                // 提取引脚数据
                const pins = obj.pin || {};

                // 转换引脚数据格式
                const pinList = Object.values(pins).map(pin => ({
                    number: parseInt(pin.configure?.spicePin || '', 10) || 0,
                    name: pin.name?.text || ''
                })).filter(pin => pin.number > 0 && pin.name);

                // 验证数据
                if (pinList.length === 0) {
                    errors.push(`元件 ${id} 没有有效引脚数据`);
                    return `/* 错误: 元件 ${id} 没有有效引脚数据 */\n`;
                }

                // 按引脚编号排序
                pinList.sort((a, b) => a.number - b.number);

                // 计算最大引脚名称长度
                // 只取左边引脚
                const leftPins = pinList.slice(0, Math.ceil(pinList.length / 2));
                const maxNameLength = Math.max(0, ...leftPins.map(pin => pin.name.length));

                // 计算芯片宽度（考虑引脚名称长度、连接线和间距），减少额外宽度
                // 根据引脚数量计算宽度，这里假设每行显示两个引脚，可根据实际情况调整
                // 计算左右对应引脚序号的最大长度
                const leftMaxNumberLength = Math.max(0, ...leftPins.map(pin => pin.number.toString().length));
                const rightPins = pinList.slice(Math.ceil(pinList.length / 2));
                const rightMaxNumberLength = Math.max(0, ...rightPins.map(pin => pin.number.toString().length));
                const maxPinNumberLength = Math.max(leftMaxNumberLength, rightMaxNumberLength);
                // 考虑连接线和间距，可根据实际情况调整
                const width = maxPinNumberLength * 2 + 11 + 2;

                // 计算顶部填充（动态宽度的顶部边框并居中）
                const topLine = '-'.repeat(width);
                // 根据用户要求设置 topPadding
                const topPadding = ' '.repeat(maxNameLength + 3);

                // 初始化输出数组
                const output = [];

                // 添加元件标题
                const annotationStr = obj.annotation && Object.values(obj.annotation)[0]?.string || '';
                const title = annotationStr ? ` ===== ${annotationStr} ===== ` : `/* ===== ${id} ===== `;
                // 计算让标题居中的填充空格
                const titlePadding = ' '.repeat(Math.floor((width - title.length) / 2) + maxNameLength + 3);
                output.push('/*' + titlePadding + title);

                // 添加芯片顶部边框（居中显示）
                output.push(` *${topPadding}${topLine}${topPadding}`);

                // 生成每一行（左侧右对齐，右侧左对齐）
                for (let i = 0; i < Math.ceil(pinList.length / 2); i++) {
                    const leftPin = pinList[i] || { name: '', number: '' };
                    const rightPin = pinList[pinList.length - 1 - i] || { name: '', number: '' };

                    // 左侧右对齐，右侧左对齐
                    const leftText = leftPin.name ? `${leftPin.name.padStart(maxNameLength)}--` : ' '.repeat(maxNameLength + 2);
                    const rightText = rightPin.name ? `--${rightPin.name.padEnd(maxNameLength)}` : ' '.repeat(maxNameLength + 2);

                    // 计算中间间距（保持为固定11个字符宽度）
                    const spacing = ' '.repeat(11);

                    // 构建行文本
                    const line = ` * ${leftText}|${leftPin.number.toString().padEnd(2)}${spacing}${rightPin.number.toString().padStart(2)}|${rightText}`;
                    output.push(line);
                }

                // 添加芯片底部边框（与顶部一致）
                output.push(` *${topPadding}${topLine}${topPadding}`);
                output.push(' */');

                return output.join('\n');
            } catch (e) {
                errors.push(`处理元件 ${id} 时出错: ${e.message}`);
                return `/* 错误: 处理元件 ${id} 失败 */\n`;
            }
        }).join('');

    } catch (e) {
        errors.push(`生成引脚图时出错: ${e.message}`);
        return '/* 错误: 生成引脚图失败 */';
    }

    // 显示所有错误信息
    if (errors.length > 0) {
        alert(`生成引脚图时发生 ${errors.length} 个错误:\n\n${errors.join('\n')}`);
    }

    return result;
}

// 复制文本到剪贴板
function copyToClipboard(text) {
    // 创建临时文本域
    const textarea = document.createElement('textarea');
    textarea.value = text;
    textarea.style.position = 'fixed';
    textarea.style.opacity = '0';

    // 添加到文档并选中
    document.body.appendChild(textarea);
    textarea.select();

    try {
        // 执行复制
        const success = document.execCommand('copy');
        if (success) {
            alert('引脚信息已复制到剪贴板！');
        } else {
            throw new Error('无法执行复制命令');
        }
    } catch (e) {
        // 备用方法：尝试使用现代API
        navigator.clipboard.writeText(text)
            .then(() => alert('引脚信息已复制到剪贴板！'))
            .catch(err => {
                console.error('复制失败:', err);
                alert('复制失败，请手动复制: ' + text);
            });
    } finally {
        // 移除临时文本域
        document.body.removeChild(textarea);
    }
}

// 使用示例
function main() {
    api('createCommand', {
        'extension-pin2txt-click': function () {
            const pinout = generateChipPinout();
            console.log(pinout);
            // 自动复制到剪贴板
            copyToClipboard(pinout);
        }
    });

    api('createToolbarButton', {
        icon: 'extensions/pin2txt/icon.svg',
        title: 'Theme Colors...',
        fordoctype: 'sch,schlib',
        "menu": [
            { "text": "生成", "cmd": "extension-pin2txt-click" },
        ]
    });
}

// 执行主函数
main();

